/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package cz.vse.adventura.po1715.xshet00_shevtsova.gui;


import cz.pecinovsky.english.pojj.adv_framework.game_gui.IGameG;
import cz.pecinovsky.english.pojj.adv_framework.game_txt.IGame;
import cz.vse.adventura.po1715.xshet00_shevtsova.Obecne;
import cz.vse.adventura.po1715.xshet00_shevtsova.hra.Hra_destnik;
import java.awt.BorderLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

/**
 *
 * @author TShevtsova
 */
public class GUI_1_Shevtsova {
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================


    /** Pozice aplikačního okna připravená práci na počítači s více monitory. */
    private static final Point POZICE_0 = Obecne.POZICE_0;

    /** Implicitní hra použitá v případě, že nebude zadána žádná jiná. */
    private IGameG IMPLICITNÍ_HRA = Hra_destnik.getHra();


//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** Aplikační okno hry. */
    private final JFrame aplikačníOkno = new JFrame();

    /** Vstupní textové pole pro zadávání příkazů. */
    private final JTextField vstupníPole = new JTextField(40);

    /** Návěští vypisující odpovědi hry. */
    private final JLabel lblOdpověď = new JLabel();
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================

    /** Hra, kterou dané gui právě ovládá. */
    private IGameG ovládanáHra;

//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================
 public GUI_1_Shevtsova()
    {
        aplikačníOkno.add(vstupníPole, BorderLayout.NORTH);
        aplikačníOkno.add(lblOdpověď,  BorderLayout.CENTER);

        vstupníPole.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                String příkaz = vstupníPole.getText();
                vstupníPole.setText("");
                zobrazOdpověď(příkaz);

                if (ovládanáHra.isReady()) {
                    System.exit(0);
                }
            }
        });

        //Zviditelnění aplikačního okna a úprava jeho velikosti a umístění
        aplikačníOkno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        aplikačníOkno.pack();
        aplikačníOkno.setVisible(true);
        aplikačníOkno.setLocation(POZICE_0);
    }

    //== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
 /***************************************************************************
     * Vrátí jméno autora/autorky programu ve tvaru "PŘÍJMENÍ Křestní",
     * tj. příjmení jako první a velkými písmeny, pak křestní jméno.
     *
     * @return Jméno autora/autorky programu ve tvaru PŘÍJMENÍ Křestní
     */
//    @Override
    public String getAuthor()
    {
        return Obecne.AUTOR;
    }


    /***************************************************************************
     * Vrátí xname autora/autorky programu zapsané valkými písmeny.
     *
     * @return XNAME autora/autorky programu zapsané valkými písmeny
     */
//    @Override
    public String getXNAME()
    {
        return Obecne.XNAME;
    }

 /***************************************************************************
     * Spustí komunikaci touto instancí a zadanou hrou, která musí být
     * ve skutečnosti instancí rozhraní {@link IGameG}
     * a která nevíc nesmí být ještě rozběhnutá - rozbíhá ji až GUI.
     *
     * @param hra Hra, kterou ma dané GUI spustit
     * @throws IllegalArgumentException Pokud zadaná hra neimplementuje
     *         rozhraní {@link IGameG} nebo pokud je již rozběhnutá
     */
//    @Override
    public void startGame(IGame hra)
    {
        if (! (hra instanceof IGameG)) {
            throw new IllegalArgumentException( "\nSpouštěná hra" +
                "neimplementuje rozhraní adventura_115_10J.rámec.IGameG");
        }
        if (! hra.isReady()) {
            throw new IllegalArgumentException(
                "\nPřed dalším spuštěním je třeba hru nejprve ukončit");
        }
        this.ovládanáHra = (IGameG)hra;          //Zapamatuje si ovládanou hru
        aplikačníOkno.setTitle(hra.getAuthor()); //Podepíše aplikační okno

        //Hru odstartujeme zadáním prázdného příkazu
        zobrazOdpověď("");

        //Od této chvíle přebírá řízení hry posluchač vstupního pole
    }


    /***************************************************************************
     * Spustí komunikaci mezi implicitní hrou (ta nesmí v danou chvíli běžet)
     * a danou instancí GUI mající na starosti komunikaci s uživatelem.
     */
//    @Override
    public void startGame()
    {
        ovládanáHra = IMPLICITNÍ_HRA;
        startGame(ovládanáHra);
    }



//+++ Přidáno pro rozšířené zadání v předmětu 4IT115 +++++++++++++++++++++++++++

    /***************************************************************************
     * Zpracuje příkaz předaný v parametru jako by byl zadán standardním
     * postupem z klávesnice. Metoda umožňuje testovat reakce daného
     * uživatelského rozhraní na příkazy zadávané z klávesnice.
     *
     * @param příkaz Zadávaný příkaz
     */
//    @Override
    public void executeCommand(String příkaz)
    {
        //TODO Operace ještě není implementována
        throw new UnsupportedOperationException(
                "Zadávání příkazů programem není implementováno");
    }



//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Metoda má na starosti zobrazení odpovědi na příkaz zadaný v parametru.
     * Odpověď zobrazuje postřednictvím návěští, přičemž ji nejprve převede
     * do formátu HTML, aby návěští zobrazilo i případné přechody na nový řádek.
     *
     * @param příkaz Zadaný příkaz
     */
    private void zobrazOdpověď(String příkaz)
    {
        String odpověď;
        odpověď = ovládanáHra.executeCommand(příkaz);
        odpověď = odpověď.replace("\n", "<br>");
        odpověď = "<html>" + odpověď + "<br>&nbsp;</html>";
        lblOdpověď.setText(odpověď);
        aplikačníOkno.setVisible(true);
        aplikačníOkno.pack();
        aplikačníOkno.setLocation(POZICE_0);
        vstupníPole.requestFocus();
    }



//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================

    /***************************************************************************
     * Testovací metoda.
     */
    public static void test()
    {
        GUI_1_Shevtsova gui = new GUI_1_Shevtsova();
        gui.startGame();
    }
    /** @param args Parametry příkazového řádku - nepoužívané. */
    public static void main( String[] args )  {  test();  }
}
